home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TeX 1995 July
/
TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO
/
systems
/
atari
/
birkhahn-metafont-packed-disks
/
mf27-2_2e-disk2.zoo
/
doc.lzh
/
BAD_POS.DOC
< prev
next >
Wrap
Text File
|
1991-08-07
|
8KB
|
149 lines
Folgende Frage taucht leider immer wieder auf, darum habe ich vor einiger
Zeit einen etwas laengeren Text verfasst, der das Problem erlaeutert und
einige Hinweise zur Vermeidung gibt. Inzwischen ist die beschriebene Fehler-
behandlung in der Datei cmlocal.mf offizieller Bestandteil meiner METAFONT-
Implementierung. Auch der Hilfstext wurde inzwischen erweitert. Mit meiner
aktuellen MF-Version kommt also nur noch die Fehlermeldung, die Zeichen-
saetze werden nicht mehr verstuemmelt. Die beschriebenen Aenderungen muessen
also nicht mehr durchgefuehrt werden.
Lutz Birkhahn, August 1991
(der Text wurde per email verschickt, darum enthaelt er keine Umlaute)
---------------------------------------------------------------------------
Frage:
> Es kommen dauernd MF-Fehlermeldungen, die ein paar Buchstaben (z.B. 'a',
> 'n' etc.) verkrueppeln. Liegt das an meiner Version (kaputte Files),
> oder passiert das auch anderen Leuten?
Das hoert sich sehr stark nach dem "bad pos"- bzw. "blacker"-Problem an.
Da dieses Problem leider haeufiger auftritt und dabei regelmaessig den
Benutzer verwirrt, will ich hier mal etwas weiter ausholen.
Symptome
========
Typische Symptome dieses Fehlers sind die METAFONT-Fehlermeldungen
"!bad pos..." oder "!bad penpos...", meist vermischt mit "!strange path..."
(das ist allerdings ein Folgefehler, dazu spaeter mehr). Das Unangenehme
daran ist, dass der Hilfetext zu den ersten beiden Fehlern voellig nichts-
sagend ist ("Pretend that you're Miss Marple: examine all clues, and
deduce the truth by inspired guesses").
Ausloeser
=========
Der Fehler wird fast immer durch "eigentlich falsche" Werte in den mode_defs
fuer die jeweiligen Drucker (in atari.mf) ausgeloest. Dort wird naemlich
haeufig der blacker-Parameter auf einen negativen Wert gesetzt, weil die
damit erzeugten Zeichensaetze in manchen Faellen eben einfach am besten
aussehen. Nadeldrucker drucken eben von Natur aus recht dicke Pixel, da
ist es durchaus nachvollziehbar, dass man die Schwaerzung der Zeichen etwas
zuruecknimmt (blacker = 0 ist der "Normalfall"). Das gleiche Problem taucht
bei write-white-Laserdruckern (z.B. Atari SLM804) auf, da man dort die
duennen Linien generell mindestens zwei Pixel breit machen muss, was zu
recht dunklen Zeichen fuehrt.
Knuth hat im Band E von Computers & Typesetting, "Computer Modern Type-
faces" auf Seite 7 ausdruecklich darauf hingewiesen, dass Probleme auftre-
ten koennen, wenn man blacker auf einen negativen Wert setzt...
Ursache
=======
Ein grosser Teil der Computer Modern Zeichensaetze wird mit Hilfe von
"virtuellen Zeichenfedern" erzeugt. Dabei werden an verschiedenen
Positionen eines Kurvenzugs die Federbreite (entspricht in realitas der
Andruckstaerke der Feder) und der Winkel, in dem die Feder gehalten wird,
angegeben. In METAFONT wird dadurch eine Aussenlinie der Kurve definiert,
die dann anschliessend ausgefuellt wird.
Soll nun in einem Zeichen eine besonders duenne Linie gezeichnet werden,
kann es passieren, dass die beiden Aussenlinien der Kurve sehr nahe zusam-
menkommen oder sogar uebereinander liegen. In Extremfaellen (z.B. bei
einem negativen blacker) kann es passieren, dass allein schon die Staerke
der Aussenlinie breiter ist als die gewuenschte (ausgefuellte) Kurve.
Man kann sich das auch so vorstellen, als wollte man mit einem Filzstift
ein Zeichen malen, indem man erstmal die Aussenlinien zeichnet und das
Innere dann ausmalt. Mit dieser Methode kann man auch keine Linien malen,
die duenner als der Filzstift selbst sind.
Genau an dieser Stelle bemerkt das pos- oder penpos-Makro (so, wie sie in
cmbase.mf definiert sind) das Problem und meldet den "bad [pen]pos"-Fehler.
Unschoenerweise erfolgt in keinem der beiden Makros irgendeine Fehlerbe-
handlung. Der Fehler wird einfach gemeldet, und danach geht es mit falschen
Werten weiter. Meist erzeugen diese falschen Werte auch noch einen selt-
samen Pfad ("strange path"), der dafuer sorgt, dass ganze Teile eines
Zeichens nicht gezeichnet werden koennen.
Besser waere es, wenn der problematische Teil der Kurve dann mit der Stift-
breite gezeichnet wird, was zwar etwas breiter als gewuenscht, aber wenig-
stens ueberhaupt einen Strich erzeugt. Alternativ koennte man sich auch
ueberlegen, ob man nicht einen etwas feineren "Filzstift" verwendet.
Fehlerbeseitigung
=================
Es gibt mehrere Moeglichkeiten, dem Fehler beizukommen. Die einfachste ist,
den Ausloeser zu verhindern, d.h. also, negative blacker-Werte zu vermei-
den, zumindest bei den Zeichensaetzen, die Probleme machen. Dazu definiere
man sich in atari.mf einen alternativen mode_def fuer das Geraet, fuer das
die Zeichensaetze erzeugt werden sollen. Man kopiert einfach den ganzen
Block von "mode_def <mein Geraet>" bis zum naechsten "enddef", und haengt
z.B. an den Geraetenamen ein "alter" (fuer alternativ) an, so dass man die
beiden mode_defs unterscheiden kann. Dann setzt man den blacker-Wert im
alternativen mode auf 0 oder ggfs. noch groesser. Mit INIMF muss dann eine
neue Base-Datei erzeugt werden (nur dabei wird atari.mf eingelesen), und
der Problem-Zeichensatz wird mit dem neuen (alternativen) mode uebersetzt.
Fuer die TeX-Shell kann man sich dazu eine Kopie der INF-Datei seines
Druckertreibers erzeugen, in der man den mode-Namen entsprechend aendert
und dann den "Drucker installiert".
Wenn man das Aendern von atari.mf und das Erstellen der Base-Datei verhin-
dern will, und wenn man eine etwas neuere Version der TeX-Shell besitzt,
kann man das ganze auch ueber den s_mode erledigen. Dazu schreibt man alles
*zwischen* der "mode_def"-Zeile und dem "enddef" in eine separate Datei,
aendert blacker wie oben, und waehlt in der Shell als s_mode die Datei,
die man gerade erzeugt hat. Das Kopieren und Aendern der INF-Datei entfaellt
in diesem Fall ebenfalls.
Wesentlich bequemer (weil auch "vorbeugend") kann man das Problem loesen,
wenn man im pos- und penpos-Makro eine Fehlerbehandlung wie oben angedeutet
einbaut. Dazu aendert man in cmbase.mf die entsprechenden Definitionen
wie folgt (so steht es momentan bei mir auf der Platte, evtl. findet sich
aber eine noch etwas schnellere und einfachere Loesung):
------------------------- cmlocal.mf ----------------------------
vardef pos@#(expr b,d) =
if known b:
if b<=currentbreadth: errmessage "bad pos";
(x@#r-x@#l,y@#r-y@#l)=(1,0) rotated d;
else: (x@#r-x@#l,y@#r-y@#l)=(b-currentbreadth,0) rotated d;
fi
else: (x@#r-x@#l,y@#r-y@#l)=(b-currentbreadth,0) rotated d;
fi
x@#=.5(x@#l+x@#r); y@#=.5(y@#l+y@#r) enddef;
vardef penpos@#(expr b,d) =
if known b:
if b<=0: errmessage "bad penpos";
(x@#r-x@#l,y@#r-y@#l)=(1,0) rotated d;
else: (x@#r-x@#l,y@#r-y@#l)=(b,0) rotated d;
fi
else: (x@#r-x@#l,y@#r-y@#l)=(b,0) rotated d;
fi
x@#=.5(x@#l+x@#r); y@#=.5(y@#l+y@#r) enddef;
--------------------- Ende von cmlocal.mf -----------------------
Dadurch werden sehr duenne Linien mit mindestens einem Pixel Breite
gezeichnet. Man aendert natuerlich nicht direkt in cmbase.mf, sondern
liest am Ende von cmbase.mf die eben beschriebene cmlocal.mf-Datei ein,
dadurch werden dann die Originaldefinitionen ueberschrieben. Durch diese
Aenderung erscheint zwar noch die Fehlermeldung, die Zeichen werden aber
dennoch einigermassen gut gezeichnet, wenn man die Meldung ignoriert.
Der "strange-path"-Fehler ist damit auch beseitigt. Bei der naechsten
offiziellen METAFONT-Version von mir wird diese Aenderung (oder eine
gleichwertige) mitgeliefert werden.